// promise
const fs = require("fs")

// let promise = new Promise((resolve, reject) => {
//   resolve("ok")
// })
//
// promise.then((value) => {
//   console.log("value =>", value);
// }, (error) => {
//
// })


// 为什么要处理链式调用?
/**
 * 比如我们要先读取 a.txt 文件, 拿到文件的具体内容, 读取内容对应的文件.
 * 比如如下的例子实现.  那么我们该怎么简化它的实现 ???
 */
// fs.readFile("a.txt", "utf8", (err, data) => {
//   fs.readFile(data, "utf8", (err, data) => { // 回调地狱,错误不好处理, 代码全部耦合在一起
//     console.log(data);
//     // fs.readFile(data, "utf8", (err, data) => { // 恶魔金字塔
//     //   console.log(data);
//     // })
//   })
// })

function readFile(...args) {
  return new Promise((resolve, reject) => {
    fs.readFile(...args, function (err, data) {
      if (err) return reject(err)
      resolve(data)
    })
  })
}

// 可以在 then 方法(成功和失败)中, 返回一个 promise. promise会采用返回的promise的成功的值或失败的值
// 会把结果返回到 下一个 then中

/**
 * 1. then() 方法中, 成功的回调, 或者失败的回调, 返回的是一个 promise. promise 会采用返回的promise的状态,
 * 走外层 下一次 then中的成功或者失败的回调, 同时将 promise 处理后的结果向下传递.
 *
 * 2. 如果 then方法中, 成功或者失败返回的是一个普通值, 不是promise. 这里会将返回的结果传递到 then
 *    的成功中去.
 *
 * 3. 如果在 then方法中 成功或者失败的回调, 执行时出错, 则会走到外层下一个then的失败中去.
 */

let Promise = require("./promise")

let promise2 = readFile("a.txt", "utf8").then((data) => {
  throw new Error("123")
}, (error) => {
  return 200
})

promise2.then((data) => {
  console.log(data);
}, (err) => {
  console.log("err111 =>", err);
})

// promise 一旦成功, 不能失败. return this 的话, 状态一旦改变, 就不会再有状态的改变.

// 如果返回的是一个 失败的promise, 或者报错了, 才会走下一个 then的失败, 否则就是走的成功回调

// 如何实现链式调用??  return new Promise()  每次都产生一个全新的 promise, 来保证状态可以成功的变化.
